home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource5 / 349_01 / sss.arc / EX_0506.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-10  |  3.7 KB  |  160 lines

  1. /* Program EX_0506.C
  2.    Listing 11C - see documentation in TUTOR.SSS
  3. */
  4.  
  5. #include <conio.h>
  6. #include "SSSC.H"
  7.  
  8. #define ARRIVL  1
  9. #define STARTA  2
  10. #define ENDACT  3
  11. #define NEXTAC  4
  12.  
  13. #define FINAL   3
  14.  
  15. #define YES     1
  16. #define NO      0
  17.  
  18. int    busy[3]   = { NO, NO, NO };
  19. int    block[3]  = { NO, NO, NO };
  20. double defect[3] = { .3, .2, .1 };
  21. int    ecode, statn, rewkn, debugf;
  22. double serial;
  23.  
  24. void prime()
  25. {
  26.   debugf = 0;
  27.   serial = 1.0;
  28.   INIQUE(3, 2, 3);
  29.   INISTA(1, "Prod t #1", 0, 0, 0/0, 0.0);
  30.   INISTA(2, "Prod t #2", 0, 0, 0.0, 0.0);
  31.   INISTA(3, "Prod t #3", 0, 0, 0.0, 0.0);
  32.   CREATE(0.0, 0);
  33.   SIMEND(6.0);
  34. }
  35.  
  36. void deciph(i)
  37. int i;
  38. {
  39.   statn = i &  3;
  40.   rewkn = i >> 2;
  41. }
  42.  
  43. void triggr(i)
  44. int i;
  45. {
  46.   REMVFQ(i, 1);
  47.   SCHED(0, NEXTAC, IDE());
  48.   if (i > 1) CREATE(0.0, i - 1);
  49. }
  50.  
  51. void unblk(statn)
  52. int statn;
  53. {
  54.   DISPOS();
  55.   if (block[statn])
  56.   {
  57.     if ((NQ(statn)) && (busy[statn] == NO))
  58.       triggr(statn);
  59.     block[statn] = NO;
  60.   }
  61. }
  62.  
  63. main()
  64. {
  65.   prime();
  66.   do
  67.   {
  68.     if ((ecode = NEXTEV()) > 0)
  69.     switch(ecode)
  70.     {
  71.  
  72.       case ARRIVL:
  73.                 if (IDE() > 0) unblk(IDE()); else
  74.                 {
  75.                   CREATE(EX(0.5), 0);
  76.                   SETA(1, RN(0.25, 0.05));
  77.                   SETA(2, serial);
  78.                   serial++;
  79.                   SCHED(0, NEXTAC, 1);
  80.                 }
  81.                 break;
  82.  
  83.       case NEXTAC:
  84.                 deciph(IDE());
  85.                 if (debugf) printf(
  86. "At%6.2f#%2.0ffor%4.2fh.to station # %d for %d rework",
  87.                   T(), A(2), A(1), statn, rewkn);
  88.  
  89.                 if (busy[statn] || block[statn])
  90.                 {
  91.                   QUEUE(statn, 0.0);
  92.                   if (debugf) printf(" and waits\n");
  93.                   if ((NQ(statn) > 4) && (statn > 1))
  94.                     block[statn - 1] = YES;
  95.                 } else
  96.  
  97.                 {
  98.                   SCHED(0.0, STARTA, IDE());
  99.                   if (debugf)
  100.                   {
  101.                     printf(" and processed\n");
  102.                     if(toupper(getch())== 'Q') exit(1);
  103.                   }
  104.                 }
  105.                 break;
  106.  
  107.       case STARTA:
  108.                 deciph(IDE());
  109.                 if (debugf) printf(
  110.                   "At %6.2f # %2.0f starts work\n",
  111.                   T(), A(2));
  112.                 if (rewkn == 0) TALLY(statn, 1.0);
  113.                 busy[statn] = YES;
  114.                 SCHED(A(1), ENDACT, IDE());
  115.                 break;
  116.  
  117.       case ENDACT:
  118.                 deciph(IDE());
  119.                 TALLY(statn, 0.0);
  120.                 if (debugf) printf(
  121.                   "At %6.2f # %2.0f ends work",
  122.                   T(), A(2));
  123.                 busy[statn] = NO;
  124.  
  125.                 if (RA() > defect[statn])
  126.                 {
  127.                   if (statn == FINAL)
  128.                   {
  129.                     DISPOS();
  130.                     if (debugf)
  131.                       printf(" and discharged\n");
  132.                   } else
  133.  
  134.                   {
  135.                     SETA(1, RN(0.25, 0.05));
  136.                     SCHED(0, NEXTAC, statn + 1);
  137.                     if (debugf)
  138.                       printf(" and goes on\n");
  139.                   }
  140.                 } else
  141.  
  142.                 {
  143.                   SETA(1, A(1)/2.0);
  144.                   SCHED(0.0, NEXTAC,
  145.                     statn + 4*(rewkn + 1));
  146.                   if (debugf)
  147.                     printf(" and recycled\n");
  148.                 }
  149.  
  150.                 if (debugf) printf(
  151.                   "At %6.2f %d are waiting at %d\n",
  152.                   T(), NQ(statn), statn);
  153.                 if (NQ(statn)) triggr(statn);
  154.                 break;
  155.     }
  156.   } while(ecode);
  157.  
  158.   SUMRY("");
  159. }
  160.